<?php
/**
 * @author Jhonatan S. Serafim
 * @since 04/07/2011
 */
abstract class SGObjetoVO extends SGObjeto {
	
	protected $nomeTabela;
	protected $nextId;
	protected $vars;
	
	public function __construct($nomeTabela, $nextId=true){
		$this->nomeTabela = $nomeTabela;
		$this->nextId = $nextId;
		$this->vars = array();
	}
	
	protected final function addVariavel($nomeVariavel, $nome, $tipo){
		$this->vars[$nomeVariavel] =& new SGObjetoVariavel($nome, $tipo);
		return $this->vars[$nomeVariavel];
	}
	
	protected final function addVariavelObject($nomeVariavel, SGObjetoVO $instanciaObject, $nome, $tipo){
		$this->vars[$nomeVariavel] =& new SGObjetoVariavelObject($instanciaObject, $nome, $tipo);
		return $this->vars[$nomeVariavel];
	}
	
	public final function getVariavelByNome($nome){
		foreach ($this->vars as $var)
			if($var->getNome() == $nome)
				return $var;
		throw new SGObjetoException('Erro ao pesquisar variável por nome: "'.$nome.'"');
	}
	
	public static function newInstance(){}
	
	public final function __call($metodo, $args){
		$nomeVariavel = $this->nomeVariavel(3, $metodo);
		if($this->vars[$nomeVariavel]){
			if(strpos($metodo, 'get') === 0 && count($args) == 0){
				if($this->vars[$nomeVariavel] instanceof SGObjetoVariavelObject)
					return $this->vars[$nomeVariavel]->getInstanciaObjeto();
				return $this->vars[$nomeVariavel]->getValor();
			}elseif(strpos($metodo, 'set') === 0 && count($args) == 1) {
				if($this->vars[$nomeVariavel] instanceof SGObjetoVariavelObject){
					if($args[0]){
						if($args[0] instanceof SGObjetoVO){
							$this->vars[$nomeVariavel]->setInstanciaObjeto($args[0]);
							$this->vars[$nomeVariavel]->setValor($args[0]->getVariavelByNome($this->vars[$nomeVariavel]->getNome())->getValor());
						}else{
							throw new SGObjetoInvalidObjectException('Erro ao atribuir valor à variável, espera-se um objeto.');
						}
					}
				}else{
					$this->vars[$nomeVariavel]->setValor($args[0]);
				}
				return $this;
			}
		}else return parent::__call($metodo, $args);
	}
	
}
?>